home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / tools / xdfc / xdfc000.lzh / XDFCOPY.S < prev    next >
Text File  |  2000-05-05  |  16KB  |  912 lines

  1. ;XDFCOPY.x version 0.00
  2.  
  3.     .include    doscall.mac
  4.     .include    iocscall.mac
  5.  
  6.     .cpu    68000
  7.  
  8.  
  9. _FAT1    equ    1024*1
  10. _FAT2    equ    1024*3
  11.  
  12. ;--------
  13.  
  14. M_CLOSE    .macro
  15.     move.w    d7,-(sp)
  16.     DOS    _CLOSE
  17.     addq.l    #2,sp
  18.     .endm
  19.  
  20. ;-------
  21.  
  22. M_OPEN    .macro    ADR
  23.     clr.w    -(sp)
  24.     pea    (a0)            ;NAMEPTR
  25.     DOS    _OPEN
  26.     addq.l    #6,sp
  27.  
  28.     move.l    d0,d7
  29.     bmi    ADR            ;存在しない場合 ADR へ
  30.     .endm
  31.  
  32. ;-----
  33.  
  34. M_PRTM    .macro    PTR
  35.     move.w    #2,-(sp)        ;標準エラー出力
  36.     pea    PTR
  37.     DOS    _FPUTS
  38.     addq.l    #6,sp
  39.     .endm
  40.  
  41.  
  42. ;--------
  43. ;ここから
  44. ;--------
  45.  
  46.     .text
  47.     .even
  48.  
  49.     lea    (a1),sp            ;mysp
  50.     lea    (wk,pc),a6        ;xdfbuf
  51. ;
  52.     pea    (title,pc)
  53.     DOS    _PRINT
  54.     addq.l    #4,sp
  55. ;
  56.     DOS    _VERNUM
  57.     cmpi.w    #$03_00,d0
  58.     bcs    err_00            ;Human68K version 3.00 以降を使用してください
  59. ;
  60.     lea    (GETBUF,pc),a3
  61.  
  62.     pea    (a3)
  63.     clr.l    -(sp)
  64.     pea    (GETNAME,pc)
  65.     DOS    _GETENV
  66.     lea    (12,sp),sp
  67. ;
  68.     move.b    (a2)+,(cmln-wk,a6)    ;コマンドライン文字数
  69.  
  70.     lea    (a2),a1            ;コマンドライン先頭
  71.     bsr    strcat_1_3
  72.  
  73. ;--------------------
  74. ;コマンドラインの解析
  75. ;--------------------
  76.  
  77.     lea    (GETBUF,pc),a2
  78.     tst.b    (a2)
  79.     beq    usage            ;引数なし
  80. chk_arg:
  81.     bsr    get_arg
  82.     beq    main            ;もう引数がない
  83. ;
  84.  
  85. ;----------
  86. ;スイッチ?
  87.  
  88.     move.b    (a0)+,d1
  89.     cmpi.b    #'-',d1
  90.     beq.s    switch?
  91.     cmpi.b    #'/',d1
  92.     bne.s    drive?
  93.  
  94. switch?:
  95.     move.b    (a0)+,d0
  96.     beq.s    chk_arg            ;次の引数をチェック
  97.  
  98.     andi.w    #$df,d0
  99.     cmpi.b    #'I',d0
  100.     bne.s    _f?
  101.  
  102.     move.b    d0,(i_flg-wk,a6)    ;-I
  103.     bra.s    switch?
  104. _f?:
  105.     cmpi.b    #'F',d0
  106.     bne.s    _o?
  107.  
  108.     bsr    chk_num
  109.     bmi    err_01            ;0 または 1 を指定してください
  110.  
  111.     move.b    d0,(f_flg-wk,a6)    ;-F[n]
  112.     bra.s    switch?
  113. _o?:
  114.     cmpi.b    #'O',d0
  115.     bne    usage
  116.  
  117.     bsr    chk_num
  118.     bmi    err_01            ;0 または 1 を指定してください
  119.  
  120.     move.b    d0,(o_flg-wk,a6)    ;-O[n]
  121.     bra.s    switch?
  122.  
  123.  
  124. ;----------
  125. ;ドライブ?
  126.  
  127. drive?:
  128.     subq.l    #1,a0
  129. ;
  130.     st.b    (mode-wk,a6)        ;(2)
  131.  
  132.     subq.w    #2,d0
  133.     bne.s    file?
  134.  
  135.     cmpi.b    #':',1(a0)
  136.     bne.s    file?
  137. ;
  138.     move.w    (DRIVE,pc),d0
  139.     bpl    err_02            ;ドライブ名を二重指定しています
  140.  
  141. ;    move.b    (a0),d1
  142.     andi.w    #$00df,d1
  143.     subi.b    #'@',d1
  144.     bcs    err_03            ;ドライブ名が異常です
  145.     cmpi.b    #26+1,d1
  146.     bcc    err_03
  147.  
  148.     move.w    d1,(DRIVE-wk,a6)
  149.     bra    chk_arg
  150.  
  151. ;------------
  152. ;ファイル名?
  153.  
  154. file?:
  155.     clr.b    (mode-wk,a6)        ;(1)
  156.  
  157.     lea    (NAMEPTR,pc),a3
  158.     tst.b    (a3)
  159.     bne    err_04            ;ファイル名を二重指定しています
  160.  
  161.     lea    (BUFFER,pc),a1
  162.  
  163.     movem.l    a0-a1,-(sp)        ;FILE,BUFFER
  164.     DOS    _NAMECK
  165.     addq.l    #8,sp
  166.  
  167.     tst.l    d0
  168.     bmi    err_05            ;ファイル名が異常です
  169.     beq.s    no_wild            ;ワイルドカードなし
  170.  
  171.     addq.b    #1,d0            ;!
  172.     bne    err_06            ;ファイル名にワイルドカードは使用できません
  173.     bra    err_07            ;ファイル名がありません
  174. ;
  175. no_wild:
  176.     move.w    #%01_0000,-(sp)        ;ディレクトリ
  177.     pea    (a0)            ;FILE
  178.     pea    (FILBUF,pc)
  179.     DOS    _FILES
  180.     lea    (10,sp),sp
  181.  
  182.     tst.l    d0
  183.     bpl    err_07            ;ファイル名がありません
  184. ;
  185.     bsr.s    strcpy_1_3        ;ドライブ名&パス名
  186.  
  187.     lea    (BUFFER+67,pc),a1    ;ファイル名
  188.     bsr.s    strcpy_1_3
  189.  
  190.     lea    (BUFFER+86,pc),a1    ;拡張子
  191.     tst.b    (a1)
  192.     beq.s    no_ext            ;ない
  193.     bsr.s    strcpy_1_3
  194.  
  195.     bra    chk_arg
  196. ;
  197. no_ext:
  198.     lea    (_xdf,pc),a1        ;'.XDF',0
  199.     bsr.s    strcpy_1_3
  200.  
  201.     bra    chk_arg
  202.  
  203. ;--------------------
  204. ;文字列の連結(複写)
  205. ;--------------------
  206. ;<a1.l    転送元
  207. ;<a3.l    転送先
  208.  
  209. strcat_1_3:
  210. @@:    tst.b    (a3)+
  211.     bne.s    @b
  212.     subq.l    #1,a3
  213.  
  214.     tst.l    d0
  215.     bmi.s    @f            ;環境変数 XDF はなかった
  216.     move.b    #' ',(a3)+
  217. strcpy_1_3:
  218. @@:    move.b    (a1)+,(a3)+
  219.     bne.s    @b
  220.     subq.l    #1,a3
  221.  
  222.     rts
  223.  
  224. ;----------------------------
  225. ;引数1つ分を arg へコピーする
  226. ;----------------------------
  227. ;<a2.l    文字列
  228. ;
  229. ;>d0.l    文字数 (0[引数なし]~510)
  230. ;>a0.l    #arg
  231. ;
  232. ;?d1,a2
  233.  
  234. get_arg:
  235.     moveq    #0,d0
  236.     lea    (arg,pc),a0
  237.     bra.s    1f
  238. @@:
  239.     addq.w    #1,d0
  240.     move.b    d1,(a0)+
  241. 1:
  242.     move.b    (a2)+,d1
  243.     beq.s    99f
  244.     cmpi.b    #' ',d1
  245.     beq.s    98f
  246.     cmpi.b    #9,d1
  247.     bne.s    @b
  248. 98:
  249. @@:    clr.b    (a0)
  250.     suba.l    d0,a0            ;a0.l = #arg
  251.  
  252.     tst.w    d0
  253.     rts
  254.  
  255. 99:
  256.     subq.l    #1,a2
  257.     bra.s    @b
  258.  
  259. ;---------------------------------
  260. ;数値をチェック(1桁 , 省略あり)
  261. ;---------------------------------
  262. ;<a0.l    文字列
  263. ;
  264. ;>d0.l    0    '0' だった
  265. ;    1    '1' だった
  266. ;    -1    エラー
  267. ;
  268. ;?d1,a0
  269.  
  270.  
  271. chk_num:
  272.     moveq    #0,d0
  273. @@:
  274.     move.b    (a0)+,d1
  275.     beq.s    99f            ;省略 , 文字列の終わり
  276.  
  277.     subi.b    #'0',d1
  278.     bne.s    1f
  279.  
  280.     tst.w    d0
  281.     bne.s    89f            ;2桁
  282.  
  283.     bra.s    @b            ;'0' は何桁でもよい(意味はないが...)
  284. 1:
  285.     subq.b    #1,d1
  286.     bne.s    99f            ;'0','1' ではなかった
  287. ;
  288.     tst.w    d0
  289.     bne.s    89f            ;2桁
  290.  
  291.     moveq    #1,d0            ;'1'
  292.     bra.s    @b
  293. ;
  294. 99:
  295.     subq.l    #1,a0
  296.     tst.w    d0            ;必要
  297.     rts
  298.  
  299. 89:
  300.     moveq    #-1,d0            ;エラー
  301.     rts
  302.  
  303.  
  304. ;----------
  305. ;メイン処理
  306. ;----------
  307.  
  308. main:
  309.     pea    (err_a,pc)        ;白帯エラーが出た時のために...
  310.     move.w    #_ERRJVC,-(sp)
  311.     DOS    _INTVCS
  312.     addq.l    #6,sp
  313. ;
  314.     moveq    #0,d2
  315.     move.b    (NAMEPTR,pc),d2
  316.     beq    err_07            ;ファイル名がありません
  317.  
  318.     subi.b    #'@',d2            ;A=1
  319. ;
  320.     move.w    (DRIVE,pc),d1
  321.     bmi    err_08            ;ドライブ名がありません
  322.     bne.s    1f            ;ドライブ名指定あり
  323. ;
  324.     moveq    #0,d1
  325. @@:
  326.     addq.w    #1,d1
  327.     cmpi.w    #26+1,d1
  328.     beq    err_09            ;2HD と DISKCOPY できる RAMDISK ドライバを登録してください
  329.     cmp.b    d1,d2
  330.     beq.s    @b            ;同じドライブ
  331.  
  332.     bsr    chk_drv
  333.     bmi.s    @b
  334.     bra.s    2f
  335. 1:
  336.     cmp.b    d1,d2
  337.     beq    err_10            ;同じドライブを指定しています
  338.  
  339.     bsr    chk_drv
  340.     bmi    err_11            ;指定されたドライブでは実行できません
  341. 2:
  342. ;
  343.     move.w    d1,-(sp)        ;MD=0
  344.     DOS    _DRVCTRL
  345.     addq.l    #2,sp
  346.  
  347.     move.b    (mode,pc),d7
  348.     bne.s    @f
  349.     bclr.l    #3,d0            ;プロテクトは (1) の場合無視
  350. @@:
  351.     move    d0,ccr
  352.     bvc    err_12            ;ディスクが入っていません
  353.     bls    err_13            ;ドライブの準備ができていません
  354.     bmi    err_14            ;ライトプロテクトされています
  355. ;
  356. ;    DOS    _FFLUSH
  357. ;    M_PRTM    (mes_00,pc)        ;バッファをフラッシュしました
  358. ;
  359.     moveq    #0,d2            ;読み(書き)込み始めるセクタ番号
  360.     moveq    #16,d3            ;読み(書き)込むセクタ数
  361.     moveq    #1,d4
  362.     ror.w    #2,d4            ;d4.l = 1024*16
  363.     moveq    #77-1,d5        ;(1232/16)-1
  364.     moveq    #$f9,d6
  365.     ror.w    #8,d6            ;d6.w = $f9ff
  366.  
  367.     lea    (NAMEPTR,pc),a0
  368. ;
  369.     tst.b    d7            ;    move.b    (mode,pc),d0
  370.     bne    XDF2RAM
  371.  
  372.  
  373. ;---------------------------------------
  374. ;(1) RAMDISK から XDF ファイルを作成する
  375. ;---------------------------------------
  376.  
  377.     move.b    (o_flg,pc),d0
  378.     bne.s    @f            ;無条件で上書きする
  379. ;
  380.     M_OPEN    @f
  381.  
  382. ;------------------
  383. ;ファイルが存在する
  384.  
  385.     M_CLOSE                ;すぐにクローズ
  386. ;
  387.     lea    (mes_01,pc),a1        ; はすでに存在します
  388.                     ;上書きしてもよろしいですか (Y/N)
  389.     lea    (mes_01_y,pc),a2    ;上書きします
  390.     lea    (crlf,pc),a3
  391.     bsr    chk_yn2
  392.  
  393.     bmi    exit0_1            ;N(,ESC)
  394. @@:
  395. ;
  396.     move.w    #%10_0000,-(sp)        ;普通のファイル
  397.     pea    (a0)            ;NAMEPTR
  398.     DOS    _CREATE
  399.     addq.l    #6,sp
  400.  
  401.     move.l    d0,d7
  402.     bmi    err_15            ;ファイルを新規作成できません
  403. ;
  404.     bsr    prt_d2w            ;   0/1232
  405. loop_1:
  406.     movem.w    d1-d3,-(sp)
  407.     pea    (a6)            ;xdfbuf
  408.     DOS    _DISKRED
  409.     lea    (10,sp),sp
  410.  
  411.     tst.w    d2
  412.     bne.s    1f
  413. ;
  414.     cmp.w    (_FAT1,a6),d6        ;d6.w = $f9ff
  415.     bne.s    @f
  416.     move.w    #$feff,(_FAT1,a6)
  417. @@:
  418.     cmp.w    (_FAT2,a6),d6
  419.     bne.s    1f
  420.     move.w    #$feff,(_FAT2,a6)
  421. 1:
  422.     add.w    d3,d2            ;d3.w = 16
  423. ;
  424.     move.l    d4,-(sp)        ;16KB
  425.     pea    (a6)
  426.     move.w    d7,-(sp)
  427.     DOS    _WRITE
  428.     lea    (10,sp),sp
  429.  
  430.     cmp.l    d0,d4
  431.     bne    er_100            ;ファイルの書き込みに失敗しました
  432. ;
  433.     bsr    prt_d2w            ;ここで表示
  434.  
  435.     st    (rw_flg-wk,a6)
  436.  
  437.     dbra    d5,loop_1
  438.  
  439. ;--------
  440. ;正常終了
  441. ;--------
  442.  
  443. exit0_0:
  444.     M_CLOSE
  445. exit0_1:
  446.     M_PRTM    (mes_02,pc)        ;正常終了しました
  447.  
  448.     DOS    _EXIT
  449.  
  450.  
  451. ;---------------------------------------------
  452. ;(2) XDF ファイルを RAMDISK に "DISKCOPY" する
  453. ;---------------------------------------------
  454.  
  455. XDF2RAM:
  456.     move.w    #%10_0000,-(sp)        ;普通のファイル
  457.     pea    (a0)            ;NAMEPTR
  458.     pea    (FILBUF,pc)
  459.     DOS    _FILES
  460.     lea    (10,sp),sp
  461.  
  462.     tst.l    d0
  463.     bmi    err_16            ;(指定されたファイルをオープンできません)
  464. ;
  465.     cmpi.l    #1261568,(FILBUF+26-wk,a6)    ;1024*1232 バイト
  466.     bne    err_17            ;ファイルのサイズが 1261568 バイトではありません
  467. ;
  468.     add.b    d1,(NAMEPTR_-wk,a6)    ;RAMDISK はルートディレクトリに変更
  469.  
  470.     pea    (NAMEPTR_,pc)        ;?:\
  471.     DOS    _CHDIR
  472.     addq.l    #4,sp
  473.  
  474.     tst.l    d0
  475.     bmi    err_18            ;指定されたドライブのカレントディレクトリをルートに変更できません
  476. ;
  477.     M_OPEN    err_16            ;指定されたファイルをオープンできません
  478. ;
  479.     bsr    prt_d2w            ;   0/1232
  480. loop_2:
  481.     move.l    d4,-(sp)        ;16KB
  482.     pea    (a6)
  483.     move.w    d7,-(sp)
  484.     DOS    _READ
  485.     lea    (10,sp),sp
  486.  
  487.     cmp.l    d0,d4
  488.     bne    er_200            ;ファイルの読み込みに失敗しました
  489.                     ;フォーマットしますか (Y/N)
  490. ;
  491.     movem.w    d1-d3,-(sp)
  492.     pea    (a6)            ;xdfbuf
  493.     DOS    _DISKWRT
  494.     lea    (10,sp),sp
  495.  
  496.     add.w    d3,d2            ;d3.w = 16
  497.     bsr    prt_d2w
  498. ;
  499.     st    (rw_flg-wk,a6)
  500.  
  501.     dbra    d5,loop_2
  502. ;
  503.     bra    exit0_0
  504.  
  505.  
  506. ;------
  507. ;エラー
  508. ;------
  509.  
  510. err_a:
  511.     lea    (wk,pc),a6        ;念のため    (xdfbuf)
  512.     lea    (mysp,pc),sp        ;戻しておく
  513.  
  514.     move.b    (rw_flg,pc),d0        ;読み書きしていなければ
  515.     beq    89f            ;そのまま終了
  516.  
  517.     DOS    _ALLCLOSE        ;削除できるようにする
  518.  
  519.     move.b    (mode,pc),d0
  520.     beq.s    er_100
  521. ;
  522. er_200:
  523.     M_CLOSE
  524. ;
  525.     move.b    (f_flg,pc),d0
  526.     beq.s    @f            ;フォーマットするか確認
  527.  
  528.     M_PRTM    (em_200_f,pc)        ;ファイルの読み込みに失敗しました
  529.                     ;フォーマットします
  530.     bra.s    er_200_f
  531. ;
  532. @@:
  533.     lea    (em_200,pc),a1
  534.     lea    (em_200_y,pc),a2    ;フォーマットします
  535.     lea    (em_200_n,pc),a3    ;フォーマットしません!
  536.     bsr    chk_yn1
  537.     bmi.s    er_200_n
  538. er_200_f:
  539.     bsr    format
  540. er_200_n:
  541.     bra    89f
  542. ;
  543. er_100:
  544.     M_CLOSE
  545.  
  546.     pea    (NAMEPTR,pc)
  547.     DOS    _DELETE
  548.     addq.l    #4,sp
  549.  
  550.     lea    (em_100,pc),a1
  551.     bra.s    88f
  552. ;
  553.     .irp    %q,00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18
  554. err_%q:
  555.     lea    (ems_%q,pc),a1
  556.     bra    88f
  557.     .endm
  558. 88:
  559.     M_PRTM    (a1)
  560.     M_PRTM    (crlf,pc)
  561.  
  562.     move.b    (cmln,pc),d0        ;0=環境変数がおかしいはず
  563.     bne.s    89f
  564.  
  565. ;----------
  566. ;使用法表示
  567. ;----------
  568.  
  569. usage:
  570.     pea    (usg_ms,pc)
  571.     DOS    _PRINT
  572.     addq.l    #4,sp
  573. 89:
  574.     move.w    #1,-(sp)
  575.     DOS    _EXIT2
  576.  
  577.  
  578. ;------------
  579. ;YNチェック
  580. ;------------
  581. ;<a0.l    ファイル名
  582. ;<a1.l    メッセージ(CR,LFなし)
  583. ;<a2.l    (CR,LF,)Y の場合のメッセージ(同上)
  584. ;<a3.l    (CR,LF,)N の場合のメッセージ(同上)
  585.  
  586. ;>(d0.l)eq    y
  587. ;    ne    n
  588. ;[>a2.l    ne    lea    (a3),a2]
  589.  
  590. chk_yn2:
  591.     M_PRTM    (a0)            ;NAMEPTR
  592. chk_yn1:
  593.     M_PRTM    (a1)
  594. ;
  595. @@:
  596.     move.w    #7,-(sp)        ;_INKEY
  597.     DOS    _KFLUSH
  598.     addq.l    #2,sp
  599.  
  600.     cmpi.b    #13,d0            ;Return,Enter
  601.     beq.s    yn_y
  602.     cmpi.b    #'',d0
  603.     beq.s    yn_n
  604. ;
  605.     andi.w    #$df,d0
  606.     cmpi.b    #'Y',d0
  607.     beq.s    yn_y
  608.     cmpi.b    #'N',d0
  609.     bne.s    @b
  610. yn_n:
  611.     lea    (a3),a2
  612.     bsr    yn_y
  613.     moveq    #-1,d0
  614.     rts
  615.  
  616. yn_y:
  617.     M_PRTM    (a2)
  618.     M_PRTM    (crlf,pc)
  619.  
  620.     moveq    #0,d0
  621.     rts
  622.  
  623.  
  624. ;-------------------------------
  625. ;RAMDISK をフォーマット (er_200)
  626. ;-------------------------------
  627.  
  628. format:
  629.     moveq    #0,d2            ;読み(書き)込み始めるセクタ番号
  630.     moveq    #16,d3            ;読み(書き)込むセクタ数
  631.     moveq    #77-1,d5        ;(1232/16)-1
  632. ;
  633.     move.l    #$f9ffff00,d6        ;念のためそのまま代入
  634.  
  635.     lea    (a6),a0            ;xdfbuf
  636.  
  637.     move.w    #4096-1,d0        ;(16*1024/4)-1
  638. @@:    move.l    d2,(a0)+
  639.     dbra    d0,@b
  640.  
  641.     move.l    d6,(_FAT1,a6)
  642.     move.l    d6,(_FAT2,a6)
  643. ;
  644.     bsr    prt_d2w            ;   0/1232
  645. loop_f:
  646.     movem.w    d1-d3,-(sp)
  647.     pea    (a6)            ;xdfbuf
  648.     DOS    _DISKWRT
  649.     lea    (10,sp),sp
  650.  
  651.     moveq    #0,d6            ;時間の無駄だが...
  652.     move.l    d6,(_FAT1,a6)
  653.     move.l    d6,(_FAT2,a6)
  654.  
  655.     add.w    d3,d2            ;d3.w = 16
  656.     bsr    prt_d2w
  657. ;
  658.     dbra    d5,loop_f
  659.     rts
  660.  
  661.  
  662. ;-----------------------
  663. ;d2.w の値を10進4桁表示
  664. ;-----------------------
  665. ;?d0,a1,a2
  666.  
  667. rl    reg    d1-d3
  668.  
  669. prt_d2w:
  670.     movem.l    rl,-(sp)
  671.  
  672.     moveq    #0,d3            ;0=スペース
  673.     lea    (p1232,pc),a1
  674.     lea    (prt_d2w_d,pc),a2
  675. prt_d2w_lp:
  676.     move.w    (a2)+,d0
  677.     beq.s    99f
  678.  
  679.     moveq    #0,d1
  680. @@:
  681.     sub.w    d0,d2
  682.     bcs.s    @f
  683.     addq.b    #1,d1
  684.     bra.s    @b
  685. @@:
  686.     add.w    d0,d2
  687. ;
  688.     tst.b    d3
  689.     bne.s    @f
  690.     tst.b    d1
  691.     bne.s    @f            ;'0' ではない
  692.     tst.w    (a2)
  693.     beq.s    @f            ;最後の1桁
  694.  
  695.     move.b    #' ',(a1)+
  696.     bra.s    prt_d2w_lp
  697. @@:
  698.     moveq    #'0',d3
  699.     add.b    d3,d1
  700.     move.b    d1,(a1)+
  701.     bra.s    prt_d2w_lp
  702. ;
  703. 99:
  704.     M_PRTM    (p1232,pc)
  705.  
  706.     movem.l    (sp)+,rl
  707.     rts
  708.  
  709. prt_d2w_d:
  710.     .dc.w    1000,100,10,1,0
  711.  
  712.  
  713. ;----------------
  714. ;ドライブを調べる
  715. ;----------------
  716. ;<d1.w    ドライブ番号(1=A:)
  717. ;
  718. ;>(d0.l)eq    2HD と DISKCOPY できる RAMDISK だった  or  2HD? だった
  719. ;
  720. ;?a0,a1
  721.  
  722. chk_drv:
  723.     lea    (DPBPTR,pc),a1
  724.  
  725.     pea    (a1)
  726.     move.w    d1,-(sp)        ;1=A:
  727.     DOS    _GETDPB
  728.     addq.l    #6,sp
  729.  
  730.     tst.l    d0
  731.     bmi    89f
  732. ;
  733.     move.b    (i_flg,pc),d0        ;-I
  734.     beq.s    chk_ram
  735.  
  736.     move.w    (DRIVE,pc),d0        ;ドライブが指定してあるか
  737.     beq.s    chk_ram
  738.  
  739.     cmpi.b    #$fe,($16,a1)        ;2HD?
  740.     beq.s    _?2HD?
  741. chk_ram:
  742.     cmpi.b    #$f9,($16,a1)        ;RAMDISK?
  743.     bne.s    89f
  744. _?2HD?:
  745.     lea    (DPB_2HD,pc),a0
  746.     addq.l    #2,a1
  747.     moveq    #4-1,d0            ;($12-$02)/4-1
  748. @@:    cmpm.l    (a0)+,(a1)+
  749.     dbne    d0,@b
  750.     bne.s    89f
  751. ;
  752.     moveq    #0,d0
  753.     rts
  754.  
  755. 89:
  756.     moveq    #-1,d0
  757.     rts
  758.  
  759.  
  760. ;-------
  761.  
  762. DPB_2HD:
  763.     .dc.w    1024        ;02 1セクタあたりのバイト数
  764.     .dc.b    1-1        ;04 1クラスタあたりのセクタ数-1
  765.     .dc.b    0        ;05 先頭クラスタのセクタ番号
  766.     .dc.w    1        ;06 FATの先頭セクタ番号
  767.     .dc.b    2        ;08 FAT領域の個数
  768.     .dc.b    2        ;09 1個のFAT領域に使用するセクタ数
  769.     .dc.w    192        ;0A ルートディレクトリに入るエントリ数
  770.     .dc.w    11        ;0C データ部の先頭セクタ番号
  771.     .dc.w    1232-11+3    ;0E 総クラスタ数+1
  772.     .dc.w    5        ;10 ルートディレクトリの先頭セクタ番号
  773.  
  774. DRIVE:
  775.     .dc.w    -1        ;_GETDPB
  776.  
  777. ;-------
  778.  
  779. title:
  780.     .dc.b    'X68k XDFCOPY v0.00 Copyright 2000 N.Matsunaga',13,10,0
  781.  
  782. usg_ms:
  783.     .dc.b    '機 能:(1) RAMDISK から XDF ファイルを作成します',13,10
  784.     .dc.b    '    (2) XDF ファイルを RAMDISK に "DISKCOPY" します',13,10
  785.     .dc.b    '使用法:(1) XDFCOPY [switch] drive filename',13,10
  786.     .dc.b    '    (2) XDFCOPY [switch] filename drive',13,10
  787.     .dc.b    'switch    -I    メディアバイトが $FE のドライブも許可する',13,10
  788.     .dc.b    '         (dirve を [A:]~[Z:] で指定している場合のみ有効)',13,10
  789.     .dc.b    '    -F[n]    フォーマット時に確認 ([0]=[する],1=しない)',13,10
  790.     .dc.b    '    -O[n]    上書き時に確認 ([0]=[する],1=しない)',13,10
  791.     .dc.b    'drive    [A:]~[Z:],[@:] で指定します',13,10,10
  792.     .dc.b    '    環境変数 XDF の内容がコマンドラインの手前に挿入されます'
  793. crlf:    .dc.b    13,10,0
  794.  
  795. p1232:
  796.     .dc.b    '????/1232',13,0
  797.  
  798. _xdf:
  799.     .dc.b    '.'
  800. GETNAME:.dc.b    'XDF',0
  801.  
  802. NAMEPTR_:
  803.     .dc.b    '@:\',0        ;_CHDIR
  804.  
  805. ems_00:
  806.     .dc.b    'Human68K version 3.00 以降を使用してください',0
  807. ems_01:
  808.     .dc.b    '0 または 1 を指定してください',0
  809. ems_02:
  810.     .dc.b    'ドライブ名を二重指定しています',0
  811. ems_03:
  812.     .dc.b    'ドライブ名が異常です',0
  813. ems_04:
  814.     .dc.b    'ファイル名を二重指定しています',0
  815. ems_05:
  816.     .dc.b    'ファイル名が異常です',0
  817. ems_06:
  818.     .dc.b    'ファイル名にワイルドカードは使用できません',0
  819. ems_07:
  820.     .dc.b    'ファイル名がありません',0
  821. ems_08:
  822.     .dc.b    'ドライブ名がありません',0
  823. ems_09:
  824.     .dc.b    '2HD と DISKCOPY できる RAMDISK ドライバを登録してください',0
  825. ems_10:
  826.     .dc.b    '同じドライブを指定しています',0
  827. ems_11:
  828.     .dc.b    '指定されたドライブでは実行できません',0
  829. ems_12:
  830.     .dc.b    'ディスクが入っていません',0
  831. ems_13:
  832.     .dc.b    'ドライブの準備ができていません',0
  833. ems_14:
  834.     .dc.b    'ライトプロテクトされています',0
  835. ems_15:
  836.     .dc.b    'ファイルを新規作成できません',0
  837. ems_16:
  838.     .dc.b    '指定されたファイルをオープンできません',0
  839. ems_17:
  840.     .dc.b    'ファイルのサイズが 1261568 バイトではありません',0
  841. ems_18:
  842.     .dc.b    '指定されたドライブのカレントディレクトリをルートに変更できません',0
  843.  
  844. em_100:
  845.     .dc.b    13,10                    ;(????/1232)
  846.     .dc.b    'ファイルの書き込みに失敗しました',0
  847.  
  848. em_200:
  849.     .dc.b    13,10                    ;(????/1232)
  850.     .dc.b    'ファイルの読み込みに失敗しました',13,10
  851.     .dc.b    'フォーマットしますか (Y/N)',0
  852. em_200_y:
  853.     .dc.b    13,10,'フォーマットします',0
  854. em_200_n:
  855.     .dc.b    13,10,'フォーマットしません!',0
  856. em_200_f:
  857.     .dc.b    13,10                    ;(????/1232)
  858.     .dc.b    'ファイルの読み込みに失敗しました',13,10
  859.     .dc.b    'フォーマットします',0
  860.  
  861. ;mes_00:
  862. ;    .dc.b    'バッファをフラッシュしました',13,10,0
  863.  
  864. mes_01:
  865.     .dc.b    ' はすでに存在します',13,10
  866.     .dc.b    '上書きしますか (Y/N)',0
  867. mes_01_y:
  868.     .dc.b    13,10,'上書きします',0
  869.  
  870. mes_02:
  871.     .dc.b    '正常終了しました',13,10,0
  872.  
  873.  
  874.     .bss
  875.     .even
  876. GETBUF:
  877.     .ds.b    256*2        ;_GETENV
  878. NAMEPTR:
  879.     .ds.b    92        ;_OPEN,_CREATE
  880. FILE:
  881.     .ds.b    92        ;_NAMECK
  882. DPBPTR:
  883. BUFFER:
  884.     .ds.b    94        ;_GETDPB,_NAMECK
  885. arg:
  886.     .ds.b    512        ;こんなにいらないとは思うけど...
  887. FILBUF:
  888.     .ds.b    53        ;_FILES
  889. cmln:
  890.     .ds.b    1        ;コマンドラインの文字数
  891. mode:
  892.     .ds.b    1        ;0=(1) , 0<>(2)
  893. i_flg:
  894.     .ds.b    1        ;0=$F9 , 0<>($F9 or $FE [DRIVE>0])
  895. f_flg:
  896.     .ds.b    1        ;(フォーマット)0=確認あり , 0<>なし
  897. o_flg:
  898.     .ds.b    1        ;(上書き)0=確認あり , 0<>なし
  899. rw_flg:
  900.     .ds.b    1        ;0<>読み書きした
  901.  
  902.     .align    4
  903. wk:
  904. xdfbuf:
  905.     .ds.b    16*1024        ;16KB
  906.  
  907.     stack
  908.  
  909.     .ds.b    8*1024        ;8KB
  910. mysp
  911.     .end
  912.